
module  lab5 		( input         Clk,
												 SW0,
                                     Reset,
												 ps2Clk,
												 ps2Data,
							  output [6:0]  HEX0, HEX1, HEX6,HEX7,
							  output [7:0]  LEDG, 
							  output [17:0] LEDR,
							  // VGA Interface 
                       output [7:0]  Red,
							                Green,
												 Blue,
							  output        VGA_clk,
							                sync,
												 blank,
												 vs,
												 hs

											);

    logic Reset_h, vssig, lasershootin, lasershootout, press; 
	 logic [9:0] WinImagexsig,WinImageysig,WinImagesizesig,
				 OverImagexsig,OverImageysig,OverImagesizesig;
	 logic enemy1_exploded, enemy1_disappeared;
	 logic enemy2_exploded, enemy2_disappeared;
	 logic enemy3_exploded, enemy3_disappeared;
    logic [9:0] drawxsig, drawysig, Rocketxsig, Rocketysig, Rocketsizesig, laserxsig; 
	 logic [9:0] laserysig, lasersizesig;
	 logic [9:0] enemy1_x, enemy1_y, enemysize;
	 logic [9:0] enemy2_x, enemy2_y; 
	 logic [9:0] enemy3_x, enemy3_y; 
	 logic [7:0] keycode;
	 logic [7:0] CountUnit;
	 logic [7:0] Count1,Count2,Count3;
	 logic pass1,pass2,pass3;
	 logic PLLout;

 
    assign {Reset_h}=~ (Reset);  // The push buttons are active low

	 keyboard keyboard_instance(
										 .Clk(Clk),
										 .psClk(ps2Clk),
										 .psData(ps2Data),
										 .keyCode(keycode),
										 .press(press),
										 .reset(Reset_h));

    vga_controller vgasync_instance(.*,
	                                 .Clk(Clk),
											   .Reset(Reset_h),
											   .pixel_clk(VGA_clk),
											   .DrawX(drawxsig),
								 			   .DrawY(drawysig) );
   
    rocket Rocket_instance(.Reset(Reset_h),
	                    .frame_clk(vs),    // Vertical Sync used as an "ad hoc" 60 Hz clock signal
	                    .RocketX(Rocketxsig),  // (This is why we registered it in the vga controller!)
							  .RocketY(Rocketysig),
							  .RocketS(Rocketsizesig),
							  .key(keycode),
							  .press(press),
							  .lasershoot(lasershootin),
							  .lasershoot_in(lasershootout),
							  .Count1(Count1),
							  .Count2(Count2),
							  .Count3(Count3),
							  .CountUnit(CountUnit));
						
	 laser Laser_instance(.Reset(Reset_h),
								 .frame_clk(vs),
								 .key(keycode),
								 .press(press),
								 .RocketX(Rocketxsig),
								 .RocketY(Rocketysig),
							    .LaserX(laserxsig),
							    .LaserY(laserysig),
							    .LaserS(lasersizesig),
								 .lasershoot_in(lasershootin),
								 .lasershoot_out(lasershootout));
								 
	 enemy1  enemy1_instance(.Reset(Reset_h),
								 .frame_clk(vs),
								 .LaserX(laserxsig),
								 .LaserY(laserysig),
							    .LaserS(lasersizesig),
								 .RocketX(Rocketxsig),
		 						 .RocketY(Rocketysig),							 
								 .EnemyX(enemy1_x),
								 .EnemyY(enemy1_y),
								 .EnemyS(enemysize),
								 .pass(pass1),
								 .exploded(enemy1_exploded),
								  .shoot(lasershootout),
								  .Count(Count1),
								 .disappeared(enemy1_disappeared));
								 
	 enemy3  enemy3_instance(.Reset(Reset_h),
								 .frame_clk(vs),
								 .LaserX(laserxsig),
								 .LaserY(laserysig),
							    .LaserS(lasersizesig),
								 .RocketX(Rocketxsig),
		 						 .RocketY(Rocketysig),							 
								 .EnemyX(enemy3_x),
								 .EnemyY(enemy3_y),
								 .EnemyS(enemysize),
								 .pass(pass3),
								 .exploded(enemy3_exploded),
								  .Count(Count3),
								  .shoot(lasershootout),
								 .disappeared(enemy3_disappeared));

	enemy2  enemy2_instance(.Reset(Reset_h),
								 .frame_clk(vs),
								 .LaserX(laserxsig),
								 .LaserY(laserysig),
							    .LaserS(lasersizesig),
								.RocketX(Rocketxsig),
		 						.RocketY(Rocketysig),							 
								 .EnemyX(enemy2_x),
								 .EnemyY(enemy2_y),
								  .Count(Count2),
								 .EnemyS(enemysize),
								 .exploded(enemy2_exploded),
								  .shoot(lasershootout),
								 .pass(pass2),
								 .disappeared(enemy2_disappeared));	
								 
								 
	WinImage WinImage_Unit        (     .WinImageX(WinImagexsig), 
												.WinImageY(WinImageysig), 
												.WinImageS(WinImagesizesig)
											);
											
  OverImage OverImage_Unit        (     .OverImageX(OverImagexsig), 
												  .OverImageY(OverImageysig), 
												  .OverImageS(OverImagesizesig)
											);	
		  
										
    color_mapper color_instance(.*,
										  .key(keycode),
										  .press(press),
		 								  .DrawX(drawxsig),
		 								  .DrawY(drawysig),
										  
	                             .RocketX(Rocketxsig),
		 								  .RocketY(Rocketysig),
										  .Rocket_size(Rocketsizesig),
										  
										  .LaserX(laserxsig),
										  .LaserY(laserysig),
										  .Laser_size(lasersizesig),
										  .Laser_shoot(lasershootin),
										  
										  .Enemy1X(enemy1_x),
										  .Enemy1Y(enemy1_y),
										  .Enemy1S(enemysize),
										  .Enemy1_exploded(enemy1_exploded),
										  .Enemy1_disappeared(enemy1_disappeared),
										  
										  .Enemy3X(enemy3_x),
										  .Enemy3Y(enemy3_y),
										  .Enemy3S(enemysize),
										  .Enemy3_exploded(enemy3_exploded),
										  .Enemy3_disappeared(enemy3_disappeared),
										  
										  .Enemy2X(enemy2_x),
										  .Enemy2Y(enemy2_y),
										  .Enemy2S(enemysize),
										  .Enemy2_exploded(enemy2_exploded),
										  .Enemy2_disappeared(enemy2_disappeared),
										  
										   .WinImageX(WinImagexsig), 
											.WinImageY(WinImageysig), 
											.WinImageS(WinImagesizesig),
																						
											.OverImageX(OverImagexsig), 
											.OverImageY(OverImageysig), 
											.OverImageS(OverImagesizesig),
										  
										   .Over((pass1)||(pass2)||(pass3)),
										
											.Win((enemy1_disappeared)&&(enemy2_disappeared)&&(enemy3_disappeared))
										  
										  
						);	
			PLL_1 PLL_1(				.*,
											.inclk0(Clk),
											.c0(PLLout)
											
											);
			LED_module LED_thing(     .*,
											.Clock(PLLout),
											.Reset(Reset_h),
										   .Over((pass1)||(pass2)||(pass3)),
											.Win((enemy1_disappeared)&&(enemy2_disappeared)&&(enemy3_disappeared)),
										   .ledr1(LEDR[8:0]),
											.ledr2(LEDR[17:9]),
											.ledg(LEDG),
											.sw0(SW0)
										  
						);	

	 HexDriver hex_inst_0 (keycode[3:0], HEX0);
	 HexDriver hex_inst_1 (keycode[7:4], HEX1);
	 
	 HexDriver hex_inst_2 (CountUnit[3:0], HEX6);
	 HexDriver hex_inst_3 (CountUnit[7:4], HEX7);
			

endmodule
